gsk: Avoid downloading GL textures when possible
authorMatthias Clasen <mclasen@redhat.com>
Sun, 27 Sep 2020 01:55:28 +0000 (21:55 -0400)
committerMatthias Clasen <mclasen@redhat.com>
Sun, 27 Sep 2020 01:55:28 +0000 (21:55 -0400)
I found that the gears demo was spending 40% cpu
downloading a GL texture every frame, only to
upload it again to another context.

While the GSK rendering and the GtkGLArea use different
GL contexts, they are (usually) connected by sharing data
with the same global context, so we can just use the
texture without the download/upload dance. This brings
gears down to < 10% cpu.

gsk/gl/gskgldriver.c

index a383344eaefe181d13c8e14176ca3e3fa1023fa2..b1f8d6ea0e5c5b28d4143ececc415abed9098c48 100644 (file)
@@ -521,8 +521,15 @@ gsk_gl_driver_get_texture_for_texture (GskGLDriver *self,
   if (GDK_IS_GL_TEXTURE (texture))
     {
       GdkGLContext *texture_context = gdk_gl_texture_get_context ((GdkGLTexture *)texture);
+      GdkGLContext *shared_context = gdk_gl_context_get_shared_context (self->gl_context);
 
-      if (texture_context != self->gl_context)
+      if (texture_context == self->gl_context ||
+          (gdk_gl_context_get_shared_context (texture_context) == shared_context && shared_context != NULL))
+        {
+          /* A GL texture from the same GL context is a simple task... */
+          return gdk_gl_texture_get_id ((GdkGLTexture *)texture);
+        }
+      else
         {
           cairo_surface_t *surface;
 
@@ -539,11 +546,6 @@ gsk_gl_driver_get_texture_for_texture (GskGLDriver *self,
 
           source_texture = downloaded_texture;
         }
-      else
-        {
-          /* A GL texture from the same GL context is a simple task... */
-          return gdk_gl_texture_get_id ((GdkGLTexture *)texture);
-        }
     }
   else
     {